home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / audio / bz / bzviewlogo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  6.0 KB  |  289 lines

  1. /*
  2.  * Copyright (C) 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /***************************************************************************
  18.  *
  19.  * @(#) - BZVIEWLOGO - View BZ logo files
  20.  *
  21.  * $Id: bzviewlogo.c,v 1.3 1993/08/11 19:46:43 adele Exp $
  22.  *
  23.  *                    Chris Fouts - Silicon Graphics, Inc.
  24.  *                    October, 1991
  25.  **************************************************************************/
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <math.h>
  29. #include <string.h>
  30.  
  31. #include <gl/gl.h>
  32. #include <gl/device.h>
  33.  
  34. static char    *version_id = "$Id: bzviewlogo.c,v 1.3 1993/08/11 19:46:43 adele Exp $" ;
  35.  
  36.  
  37. #define    BZL_BGNTMESH    0
  38. #define    BZL_SWAPTMESH    1
  39. #define    BZL_ENDBGNTMESH    2
  40. #define    BZL_RETENDTMESH    3
  41. #define    BZL_LEFTSIDE    4
  42. #define    BZL_RIGHTSIDE    5
  43. #define    BZL_NOSIDE        6
  44. #define LOGO_SIZE        500
  45.  
  46. typedef unsigned long GL_Object ;
  47.  
  48. /* BEGIN PROTOTYPES -S bzviewlogo.c */
  49. static GL_Object    create_logo( unsigned char *logodata )  ;
  50. static int          read_logo( const char *filename )  ;
  51. /* END PROTOTYPES -S bzviewlogo.c */
  52.  
  53. void main(
  54.     int argc,
  55.     char **argv
  56.     )
  57. {
  58.     GL_Object    logo ;
  59.     int            redraw = 1 ;
  60.     short        val ;
  61.  
  62.     foreground() ;
  63.     keepaspect( 1, 1 ) ;
  64.     winopen( argv[0] ) ;
  65.  
  66.     logo = read_logo( argv[1] ) ;
  67.  
  68.     qdevice( ESCKEY ) ;
  69.  
  70.     while( logo ) {
  71.         if( redraw ) {
  72.             reshapeviewport() ;
  73.             ortho2( -10., 265., -10., 265. ) ;
  74.             redraw = 0 ;
  75.             color( WHITE ) ;
  76.             clear() ;
  77.             color( BLACK ) ;
  78.             callobj( logo ) ;
  79.             }
  80.         while( qtest() ) {
  81.             switch( qread( &val ) ) {
  82.  
  83.                 case REDRAW :
  84.                     redraw = 1 ;
  85.                     break ;
  86.  
  87.                 case ESCKEY :
  88.                     logo = 0 ;
  89.                     break ;
  90.                 }
  91.             }
  92.         }
  93.     
  94. }
  95.  
  96.  
  97.  
  98. static int read_logo(
  99.     const char *filename
  100.     )
  101. {
  102.     FILE            *f ;
  103.     char            line[128] ;
  104.     unsigned char    logodata[LOGO_SIZE] ;
  105.     int                n = 0 ;
  106.     int                npts ;
  107.     int                x ;
  108.     int                y ;
  109.     int                version ;
  110.     int                global = 1 ;
  111.     int                ln = 0 ;
  112.     int                nbtm = 0 ;
  113.  
  114.     if( ( f = fopen( filename, "r" ) ) == NULL ) {
  115.         perror( filename ) ;
  116.         return( 0 ) ;
  117.         }
  118.  
  119.     fgets( line, sizeof( line ), f ) ;
  120.     ln++ ;
  121.  
  122.     if( strcmp( line, "# BZLOGO Version 1.1\n" ) == 0 ) {
  123.         version = 11 ;
  124.         }
  125.     else if( strcmp( line, "# BZLOGO Version 1.0\n" ) == 0 ) {
  126.         version = 10 ;
  127.         global = 0 ;
  128.         }
  129.     else {
  130.         fclose( f ) ;
  131.         fprintf( stderr, "read_logo: bad magic number in logo file.\n" ) ;
  132.         return( 0 ) ;
  133.         }
  134.  
  135.     while( 1 ) {
  136.         if( fgets( line, sizeof( line ), f ) == NULL ) {
  137.             fclose( f ) ;
  138.             fprintf( stderr, "read_logo: premature end of file.\n" ) ;
  139.             return( 0 ) ;
  140.             }
  141.         ln++ ;
  142.  
  143.         if( strcmp( line, "BGNTMESH\n" ) == 0 ) {
  144.             if( nbtm > 0 ) {
  145.                 fprintf( stderr, "read_logo: error on line %d -- embedded call "
  146.                          "to BGNTMESH (use ENDBGNTMESH)\n", ln ) ;
  147.                 return( 0 ) ;
  148.                 }
  149.             nbtm = 1 ;
  150.             logodata[n++] = BZL_BGNTMESH ;
  151.             global = 0 ;
  152.             }
  153.         else if( strcmp( line, "SWAPTMESH\n" ) == 0 ) {
  154.             logodata[n++] = BZL_SWAPTMESH ;
  155.             global = 0 ;
  156.             }
  157.         else if( strcmp( line, "ENDBGNTMESH\n" ) == 0 ) {
  158.             logodata[n++] = BZL_ENDBGNTMESH ;
  159.             global = 0 ;
  160.             }
  161.         else if( strcmp( line, "RETENDTMESH\n" ) == 0 ) {
  162.             logodata[n++] = BZL_RETENDTMESH ;
  163.             global = 0 ;
  164.             break ;
  165.             }
  166.         else if( global == 1 && strcmp( line, "LEFTSIDE\n" ) == 0 ) {
  167.             logodata[n++] = BZL_LEFTSIDE ;
  168.             }
  169.         else if( global == 1 && strcmp( line, "RIGHTSIDE\n" ) == 0 ) {
  170.             logodata[n++] = BZL_RIGHTSIDE ;
  171.             }
  172.         else {
  173.             fclose( f ) ;
  174.             fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  175.             return( 0 ) ;
  176.             }
  177.  
  178.         if( global ) {
  179.             npts = 0 ;
  180.             }
  181.         else {
  182.             if( fscanf( f, "%d", &npts ) != 1 || npts < 1 ) {
  183.                 fclose( f ) ;
  184.                 fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  185.                 return( 0 ) ;
  186.                 }
  187.             ln++ ;
  188.  
  189.             /*
  190.              * Check size of logo:
  191.              *
  192.              *   NUMBER_PTS_ALREADY + NEXT_CMD + N_PTS + N_PTS * 2
  193.              */
  194.             if( n + 2 + 2 * npts >= LOGO_SIZE ) {
  195.                 fclose( f ) ;
  196.                 fprintf( stderr, "read_logo: logo too big "
  197.                                  "(maximum of %d words)\n", LOGO_SIZE ) ;
  198.                 return( 0 ) ;
  199.                 }
  200.  
  201.             logodata[n++] = npts ;
  202.  
  203.             while( npts-- ) {
  204.                 if( fscanf( f, "%d %d", &x, &y ) != 2 || x < 0 || y < 0 ||
  205.                     x > 255 || y > 255 ) {
  206.                     fclose( f ) ;
  207.                     fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  208.                     return( 0 ) ;
  209.                     }
  210.                 ln++ ;
  211.                 logodata[n++] = x ;
  212.                 logodata[n++] = y ;
  213.                 }
  214.  
  215.             /*
  216.              * Get trailing line feed.
  217.              */
  218.             if( fgetc( f ) != '\n' ) {
  219.                 fclose( f ) ;
  220.                 fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  221.                 return( 0 ) ;
  222.                 }
  223.             }
  224.         }
  225.  
  226.     fclose( f ) ;
  227.  
  228.     return( create_logo( logodata ) ) ;
  229. }
  230.  
  231.  
  232.  
  233. static GL_Object create_logo(
  234.     unsigned char *logodata
  235.     )
  236. {
  237.     GL_Object        obj = 1 ;
  238.     unsigned char    glyph ;
  239.     int                npts ;
  240.     float            pt[2] ;
  241.     int                expect_points ;
  242.  
  243.     makeobj( obj ) ;
  244.  
  245.         while( ( glyph = *(logodata++) ) != BZL_RETENDTMESH ) {
  246.             switch( glyph ) {
  247.                 case BZL_BGNTMESH :
  248.                     bgntmesh() ;
  249.                     expect_points = 1 ;
  250.                     break ;
  251.                 case BZL_SWAPTMESH :
  252.                     swaptmesh() ;
  253.                     expect_points = 1 ;
  254.                     break ;
  255.                 case BZL_ENDBGNTMESH :
  256.                     endtmesh() ;
  257.                     bgntmesh() ;
  258.                     expect_points = 1 ;
  259.                     break ;
  260.                 case BZL_LEFTSIDE :
  261.                 case BZL_RIGHTSIDE :
  262.                     expect_points = 0 ;
  263.                     break ;
  264.                 default :
  265.                     closeobj() ;
  266.                     delobj( obj ) ;
  267.                     fprintf( stderr, "create_logo: bad logo info\n" ) ;
  268.                     return( 0 ) ;
  269.                 }
  270.  
  271.             if( expect_points ) {
  272.                 npts = *(logodata++) ;
  273.                 while( npts > 0 ) {
  274.                     pt[0] = *(logodata++) ;
  275.                     pt[1] = *(logodata++) ;
  276.                     v2f( pt ) ;
  277.                     npts-- ;
  278.                     }
  279.                 }
  280.             }
  281.         endtmesh() ;
  282.     closeobj() ;
  283.  
  284.     return( obj ) ;
  285. }
  286.  
  287.  
  288.  
  289.